package com.zp.self.module.level_4_算法练习.数据结构.数组;

import org.junit.Test;

import java.util.LinkedList;
import java.util.List;

/**
 * @author By ZengPeng
 */
public class 力扣_1018_可被5整除的二进制前缀{
    @Test
    public void main() {
        
        Solution solution = new 力扣_1018_可被5整除的二进制前缀().new Solution();
        System.out.println(solution.prefixesDivBy5(new int[]{1,1,1}));
    }

/**
 题目：给定一个二进制数组 nums ( 索引从0开始 )。
     我们将xi 定义为其二进制表示形式为子数组 nums[0..i] (从最高有效位到最低有效位)。
     例如，如果 nums =[1,0,1] ，那么 x0 = 1, x1 = 2, 和 x2 = 5。
     返回布尔值列表 answer，只有当 xi 可以被 5 整除时，答案 answer[i] 为 true，否则为 false。

     示例 1：
     输入：nums = [0,1,1]
     输出：[true,false,false]
     解释：
     输入数字为 0, 01, 011；也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除，因此 answer[0] 为 true 。

     示例 2：
     输入：nums = [1,1,1]
     输出：[false,false,false]

     提示：
     1 <= nums.length <= 105
     nums[i] 仅为 0 或 1

 分析：【P 💖💖💖】
    1.遍历：记录余数，计算下一个值时，余数翻倍 + 当前位。判断是否整除5，记录余数
            --执行用时：3 ms, 在所有 Java 提交中击败了97.54%的用户
            --编码耗时:[20分钟左右]

 边界值 & 注意点：
    1.
 **/
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public List<Boolean> prefixesDivBy5(int[] nums) {
    int remainder=0;
    List<Boolean> res = new LinkedList<>();
    for (int num : nums) {
        remainder = ((remainder<<1) +num)%5;
        if(remainder==0){
            res.add(true);
        }else {
            res.add(false);
        }
    }
    return res;
}
}
//leetcode submit region end(Prohibit modification and deletion)

}